﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AudiPyme.DAL;

namespace AudiPyme.BLL
{
    //Clase para formatear los datos de la Matriz Amenaza - Vulnerabilidad de la base de conocimiento
    public class TablaMatrizAmenVuln
    {

        int idAmenaza;

        public int IdAmenaza
        {
            get { return idAmenaza; }
            set { idAmenaza = value; }
        }
        String amenaza;

        public String Amenaza
        {
            get { return amenaza; }
            set { amenaza = value; }
        }
        int idVulnerabilidad;

        public int IdVulnerabilidad
        {
            get { return idVulnerabilidad; }
            set { idVulnerabilidad = value; }
        }
        String vulnerabilidad;

        public String Vulnerabilidad
        {
            get { return vulnerabilidad; }
            set { vulnerabilidad = value; }
        }

        public TablaMatrizAmenVuln()
        {
            idAmenaza = 0;
            amenaza = "";
            idVulnerabilidad = 0;
            vulnerabilidad = "";
        }
        public TablaMatrizAmenVuln(int IdAmenaza, String Amenaza, int IdVulnerabilidad, String Vulnerabilidad)
        {
            this.idAmenaza = IdAmenaza;
            this.amenaza = Amenaza;
            this.idVulnerabilidad = IdVulnerabilidad;
            this.vulnerabilidad = Vulnerabilidad;
        }

        //Método que devuelve las relaciones Amenaza - Vulnerabilidad actuales de la base de conocimiento
        public static List<TablaMatrizAmenVuln> RelacionesAmenazaVulnerabilidad()
        {
            ModeloContainer agenteBD = new ModeloContainer();
            List<TablaMatrizAmenVuln> LRelaciones = new List<TablaMatrizAmenVuln>();
            IQueryable<TablaMatrizAmenVuln> relaciones = (from m in agenteBD.Matriz_AmenazasVulnerabilidadesEstablecer
                                                          join a in agenteBD.AmenazasEstablecer on m.IdAmenaza equals a.IdAmenaza
                                                          join v in agenteBD.VulnerabilidadesEstablecer on m.IdVulnerabilidad equals v.IdVulnerabilidad
                                                          where m.Actual == true
                                                          select new TablaMatrizAmenVuln { IdAmenaza = m.IdAmenaza, Amenaza = a.Amenaza, IdVulnerabilidad = m.IdVulnerabilidad, Vulnerabilidad = v.Vulnerabilidad }).Distinct().OrderBy(i => i.IdAmenaza).ThenBy(v => v.IdVulnerabilidad);
            if (relaciones.Count() != 0)
            {
                LRelaciones = relaciones.ToList();
            }
            return LRelaciones;
        }

        //Método que devuelve las relaciones Amenaza - Vulnerabilidad eliminadas (borrado lógico) de la base de conocimiento
        public static List<TablaMatrizAmenVuln> RelacionesAmenazaVulnerabilidadEliminadas()
        {
            ModeloContainer agenteBD = new ModeloContainer();
            List<TablaMatrizAmenVuln> LRelaciones = new List<TablaMatrizAmenVuln>();
            IQueryable<TablaMatrizAmenVuln> relaciones = (from m in agenteBD.Matriz_AmenazasVulnerabilidadesEstablecer
                                                          join a in agenteBD.AmenazasEstablecer on m.IdAmenaza equals a.IdAmenaza
                                                          join v in agenteBD.VulnerabilidadesEstablecer on m.IdVulnerabilidad equals v.IdVulnerabilidad
                                                          where m.Actual == false
                                                          select new TablaMatrizAmenVuln { IdAmenaza = m.IdAmenaza, Amenaza = a.Amenaza, IdVulnerabilidad = m.IdVulnerabilidad, Vulnerabilidad = v.Vulnerabilidad }).Distinct().OrderBy(i => i.IdAmenaza).ThenBy(v => v.IdVulnerabilidad);
            if (relaciones.Count() != 0)
            {
                LRelaciones = relaciones.ToList();
            }
            return LRelaciones;
        }

        //Método que devuelve las relaciones Amenaza - Vulnerabilidad actuales de la base de conocimiento cuyos nombres de amenaza contengan la secuencia de TextoBuscar
        public static List<TablaMatrizAmenVuln> RelacionesAmenazaVulnerabilidadPorAmenaza(String TextoBuscar)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            List<TablaMatrizAmenVuln> LRelaciones = new List<TablaMatrizAmenVuln>();
            IQueryable<TablaMatrizAmenVuln> relaciones = (from m in agenteBD.Matriz_AmenazasVulnerabilidadesEstablecer
                                                          join a in agenteBD.AmenazasEstablecer on m.IdAmenaza equals a.IdAmenaza
                                                          join v in agenteBD.VulnerabilidadesEstablecer on m.IdVulnerabilidad equals v.IdVulnerabilidad
                                                          where a.Amenaza.Contains(TextoBuscar) && m.Actual == true
                                                          select new TablaMatrizAmenVuln { IdAmenaza = m.IdAmenaza, Amenaza = a.Amenaza, IdVulnerabilidad = m.IdVulnerabilidad, Vulnerabilidad = v.Vulnerabilidad }).Distinct().OrderBy(i => i.IdAmenaza).ThenBy(v => v.IdVulnerabilidad);
            if (relaciones.Count() != 0)
            {
                LRelaciones = relaciones.ToList();
            }
            return LRelaciones;
        }

        //Método que devuelve las relaciones Amenaza - Vulnerabilidad eliminadas de la base de conocimiento cuyos nombres de amenaza contengan la secuencia de TextoBuscar
        public static List<TablaMatrizAmenVuln> RelacionesAmenazaVulnerabilidadEliminadasPorAmenaza(String TextoBuscar)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            List<TablaMatrizAmenVuln> LRelaciones = new List<TablaMatrizAmenVuln>();
            IQueryable<TablaMatrizAmenVuln> relaciones = (from m in agenteBD.Matriz_AmenazasVulnerabilidadesEstablecer
                                                          join a in agenteBD.AmenazasEstablecer on m.IdAmenaza equals a.IdAmenaza
                                                          join v in agenteBD.VulnerabilidadesEstablecer on m.IdVulnerabilidad equals v.IdVulnerabilidad
                                                          where a.Amenaza.Contains(TextoBuscar) && m.Actual == false
                                                          select new TablaMatrizAmenVuln { IdAmenaza = m.IdAmenaza, Amenaza = a.Amenaza, IdVulnerabilidad = m.IdVulnerabilidad, Vulnerabilidad = v.Vulnerabilidad }).Distinct().OrderBy(i => i.IdAmenaza).ThenBy(v => v.IdVulnerabilidad);
            if (relaciones.Count() != 0)
            {
                LRelaciones = relaciones.ToList();
            }
            return LRelaciones;
        }

        //Método que devuelve las relaciones Amenaza - Vulnerabilidad actuales de la base de conocimiento cuyos nombres de vulnerabilidad contengan la secuencia de TextoBuscar
        public static List<TablaMatrizAmenVuln> RelacionesAmenazaVulnerabilidadPorVulnerabilidad(String TextoBuscar)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            List<TablaMatrizAmenVuln> LRelaciones = new List<TablaMatrizAmenVuln>();
            IQueryable<TablaMatrizAmenVuln> relaciones = (from m in agenteBD.Matriz_AmenazasVulnerabilidadesEstablecer
                                                          join a in agenteBD.AmenazasEstablecer on m.IdAmenaza equals a.IdAmenaza
                                                          join v in agenteBD.VulnerabilidadesEstablecer on m.IdVulnerabilidad equals v.IdVulnerabilidad
                                                          where v.Vulnerabilidad.Contains(TextoBuscar) && m.Actual == true
                                                          select new TablaMatrizAmenVuln { IdAmenaza = m.IdAmenaza, Amenaza = a.Amenaza, IdVulnerabilidad = m.IdVulnerabilidad, Vulnerabilidad = v.Vulnerabilidad }).Distinct().OrderBy(i => i.IdAmenaza).ThenBy(v => v.IdVulnerabilidad);
            if (relaciones.Count() != 0)
            {
                LRelaciones = relaciones.ToList();
            }
            return LRelaciones;
        }

        //Método que devuelve las relaciones Amenaza - Vulnerabilidad eliminadas de la base de conocimiento cuyos nombres de vulnerabilidad contengan la secuencia de TextoBuscar
        public static List<TablaMatrizAmenVuln> RelacionesAmenazaVulnerabilidadEliminadasPorVulnerabilidad(String TextoBuscar)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            List<TablaMatrizAmenVuln> LRelaciones = new List<TablaMatrizAmenVuln>();
            IQueryable<TablaMatrizAmenVuln> relaciones = (from m in agenteBD.Matriz_AmenazasVulnerabilidadesEstablecer
                                                          join a in agenteBD.AmenazasEstablecer on m.IdAmenaza equals a.IdAmenaza
                                                          join v in agenteBD.VulnerabilidadesEstablecer on m.IdVulnerabilidad equals v.IdVulnerabilidad
                                                          where v.Vulnerabilidad.Contains(TextoBuscar) && m.Actual == false
                                                          select new TablaMatrizAmenVuln { IdAmenaza = m.IdAmenaza, Amenaza = a.Amenaza, IdVulnerabilidad = m.IdVulnerabilidad, Vulnerabilidad = v.Vulnerabilidad }).Distinct().OrderBy(i => i.IdAmenaza).ThenBy(v => v.IdVulnerabilidad);
            if (relaciones.Count() != 0)
            {
                LRelaciones = relaciones.ToList();
            }
            return LRelaciones;
        }
    }
}
